<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // new关键做了什么操作
    // 1.创建了一个纯净的对象  {}
    // 2.给创建的实例化对象绑定原型属性 (新版本: [[Prototype]] 老版本:__proto__)指向构造函数的原型对象 => 所有的实例化对象都可以通过此属性访问构造函数的原型对象
    // 3.将this指向创建的实例化对象
    // 4.默认返回创建的实例化对象(this)

    // this指向:  每次调用构造函数,都会创建一个新的实例化对象(this就指向构造函数在执行过程中创建的实例化对象) 
    // 注意: 为了区分普通函数和构造函数,建议构造函数首字母大写




    // 作为普通函数调用
    // function fn() {
    //     console.log(this); // window
    // }
    // var result = fn();  // undefined
    // console.log(result);


    // 作为构造函数调用 (构造函数也是一个函数,只不过new关键通过一系列操作,让结果变得不一样)
    function Fn() {
        // {}
        // this -> {}

        console.log("this", this);  // {}

        // 我们要做的 => 将属性和方法绑定到实例化对象上

        // return this;
    }

    // 调用构造函数Fn => 执行构造函数中的上下文  => 返回新的实例化对象 => 赋值给变量result
    var result = new Fn();
    console.log("返回值", result, result instanceof Fn);  // {}


    // var arr = new Array();
    // console.log(arr);

</script>

</html>